package reflection.question;

import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.Properties;

/**
 * @author DCSGO
 * @version 1.0
 * 反射引入、快速入门
 */
public class ReflectionQuestion {
    public static void main(String[] args) throws IOException, ClassNotFoundException, NoSuchMethodException, InvocationTargetException, IllegalAccessException, InstantiationException {
        //通过读取配置文件 re.properties 实例化一个 classfullpath 对应的对象并调用其 method 对应的方法
        //1.读取配置信息
        Properties properties = new Properties();
        properties.load(new FileReader("src\\re.properties"));
        String classfullpath = properties.getProperty("classfullpath");
        String methodName = properties.getProperty("method");
        System.out.println("classfullpath = " + classfullpath);
        System.out.println("methodName = " + methodName);

        //2.创建对象
        //classfullpath cat = new classfullpath();//无法通过编译
        //字符串对象 是不能用直接当做类名 来实例化对象的！！！ 常规方法无法解决需求

        //反射解决上述需求
        //1.加载类 返回 Class 类型的对象
        Class cls = Class.forName(classfullpath);

        //2.通过 cls 得到它加载的类的 对象实例 o
        Object o = cls.newInstance();
        System.out.println("o.getClass = " + o.getClass());

        //3.通过 cls 得到它加载的类的 与 methodName 对应的方法对象
        Method met = cls.getMethod(methodName);

        //4.通过 met 调用方法 -> 通过方法对象来实现调用 cls 的该方法
        met.invoke(o);/* 传统方法 对象.方法() 反射机制 方法.invoke(对象) */
        //此时就解决了上述需求 源代码保持不变修改配置文件中相应内容即可使程序的运行发送变化

        /* 配置文件中 method=hi
         * classfullpath = cat.Cat
         * methodName = hi
         * o.getClass = class cat.Cat
         * 招财猫 喵喵叫~
         *
         * 进程已结束，退出代码为 0
         */

        /* 配置文件中 method=move
         * classfullpath = cat.Cat
         * methodName = move
         * o.getClass = class cat.Cat
         * 招财猫 在跑！
         *
         * 进程已结束，退出代码为 0
         */
    }
}
